#ifndef _LEXICO_H
#define _LEXICO_H

#include<conio.h>
#include<stdio.h>
#include<string.h>

#define CantidadEstados   34
#define CantidadEventos   26
#define LongitudToken     100
#define CE                CantidadEstados
#define EE                -1
#define LongitudCteSTR   30


#define tk_Oper_Neg   0 //! -> 33
#define tk_Comilla    1 //" -> 34
#define tk_Oper_And   2 //& -> 37
#define tk_Par_Abre   3 //( -> 39
#define tk_Par_Cierra 4 //) -> 40 
#define tk_Oper_Multi 5 //* -> 42
#define tk_Oper_Sum   6 //+ -> 43
#define tk_Coma       7 //, -> 44
#define tk_Oper_Resta 8 //- -> 45
#define tk_Punto      9 //. -> 46
#define tk_Oper_Div   10 /// -> 47
#define tk_digito     11 //0..9 -> 48..57
#define tk_DosPuntos  12 //: -> 58
#define tk_PuntoComa  13 //; -> 59
#define tk_Oper_Menor 14 //< -> 60
#define tk_Oper_Igual 15 //= -> 61
#define tk_Oper_Mayor 16 //> -> 62
#define tk_LetraMin   17 //a..z -> 65..90
#define tk_Cor_Abre   18 //[ ->  91
#define tk_Cor_Cierra 19 //] -> 93 
#define tk_LetraMayu  20 //A..Z -> 97..122
#define tk_Llave_Abre 21 //{ -> 123
#define tk_Oper_OR    22 //| -> 124
#define tk_Llave_Cier 23 //} -> 125
#define tk_Enter      24 // -> 10
#define tk_TabSpace   25 // -> 9 || 32
#define tk_Error      EE

#define ttk_Identificador   100
#define ttk_Cte_Num         101
#define ttk_Cte_Str         102
#define ttk_Pal_Res         103
#define ttk_Terminal        104

#define tdato_NULO          0
#define tdato_INTEGER       200
#define tdato_STRING        201
#define tdato_FLOAT         202

void ConfigurarLex(FILE *ArchivoFuente, FILE *ArchivoTokens, FILE *ArchivoDebug);
void yylex(void);

int AgregarTokenEnLista(char * token, int tipoToken);
void MostrarLista(void);
int ValidarCaracter(int caracter);
int EsPalabraReservada(char * token);
void BuscarNombreTipoToken(int tipo);

struct _TablaSimbolos
{
 int id;
 char nombre[LongitudToken];
 int tipoToken;
 int tipoDato;
 char valor[LongitudCteSTR];
};

typedef struct _TablaSimbolos TablaDeSimbolos;
/*****************FUNCIONES LEXICAS***************************/
void Inic_Id(void);
void Cont_Id(void);
void Fin_Id(void);
void ICte_Num(void);
void CCte_Num(void);
void FCte_Num(void);
void ICte_Str(void);
void CCte_Str(void);
void FCte_Str(void);
void Op_Suma(void);
void Op_Resta(void);
void Op_Mult(void);
void Op_Div(void);
void Op_Comp(void);
void Op_Dist(void);
void Par_Abre(void);
void Par_Cier(void);
void COtraBas(void);
void FOtraBas(void);
void Op_MenIg(void);
void Op_MayIg(void);
void OpComent(void);
void Coment(void);
void FOpComen(void);
void OpComen2(void);
void Comen2(void);
void FOpCome2(void);
void Op_And(void);
void Op_Or(void);
void Op_Coma(void);
void Op_Punto(void);
void Op_2Punt(void);
void Op_PunYC(void);
void Op_CorAb(void);
void Op_CorCi(void);
void Op_LlavA(void);
void Op_LlavC(void);
void Op_Enter(void);
void ReProce(void);
void FIN(void);
void ERROR(void);
/*****************FUNCIONES LEXICAS***************************/
#endif
